From a8add4da193a45f0486cbe01f0ab2a48938d9d7a Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Tue, 22 Apr 2008 11:46:41 +0100 Subject: [PATCH] x86 iommu: Better synchronisation on dirq_mask. Signed-off-by: Keir Fraser --- xen/arch/x86/hvm/svm/intr.c | 4 +++- xen/arch/x86/hvm/vmx/intr.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/hvm/svm/intr.c b/xen/arch/x86/hvm/svm/intr.c index 4b3dcd33ad..3463ac42a6 100644 --- a/xen/arch/x86/hvm/svm/intr.c +++ b/xen/arch/x86/hvm/svm/intr.c @@ -109,8 +109,10 @@ static void svm_dirq_assist(struct vcpu *v) irq < NR_IRQS; irq = find_next_bit(hvm_irq_dpci->dirq_mask, NR_IRQS, irq + 1) ) { + if ( !test_and_clear_bit(irq, &hvm_irq_dpci->dirq_mask) ) + continue; + stop_timer(&hvm_irq_dpci->hvm_timer[irq_to_vector(irq)]); - clear_bit(irq, &hvm_irq_dpci->dirq_mask); list_for_each_entry ( digl, &hvm_irq_dpci->mirq[irq].digl_list, list ) { diff --git a/xen/arch/x86/hvm/vmx/intr.c b/xen/arch/x86/hvm/vmx/intr.c index dc47430a63..3fcfc52175 100644 --- a/xen/arch/x86/hvm/vmx/intr.c +++ b/xen/arch/x86/hvm/vmx/intr.c @@ -118,8 +118,10 @@ static void vmx_dirq_assist(struct vcpu *v) irq < NR_IRQS; irq = find_next_bit(hvm_irq_dpci->dirq_mask, NR_IRQS, irq + 1) ) { + if ( !test_and_clear_bit(irq, &hvm_irq_dpci->dirq_mask) ) + continue; + stop_timer(&hvm_irq_dpci->hvm_timer[irq_to_vector(irq)]); - clear_bit(irq, &hvm_irq_dpci->dirq_mask); list_for_each_entry ( digl, &hvm_irq_dpci->mirq[irq].digl_list, list ) { -- 2.30.2